package com.reservation.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.reservation.entity.GuideReservation;

import java.time.LocalDate;
import java.util.List;

/**
 * 解说员预约服务接口
 */
public interface GuideReservationService {

    /**
     * 创建解说员预约
     *
     * @param reservation 预约信息
     * @return 创建成功的预约信息
     */
    GuideReservation createReservation(GuideReservation reservation);

    /**
     * 更新预约状态
     *
     * @param id     预约ID
     * @param status 预约状态
     * @return 更新后的预约信息
     */
    GuideReservation updateReservationStatus(Long id, String status);

    /**
     * 获取预约详情
     *
     * @param id 预约ID
     * @return 预约信息
     */
    GuideReservation getReservationById(Long id);

    /**
     * 取消预约
     *
     * @param id 预约ID
     * @return 是否成功
     */
    boolean cancelReservation(Long id);

    /**
     * 分页查询用户的预约列表
     *
     * @param page   分页参数
     * @param userId 用户ID
     * @param status 预约状态（可选）
     * @return 预约列表
     */
    IPage<GuideReservation> getUserReservations(Page<GuideReservation> page, Long userId, String status);

    /**
     * 分页查询解说员的预约列表
     *
     * @param page    分页参数
     * @param guideId 解说员ID
     * @param status  预约状态（可选）
     * @param date    预约日期（可选）
     * @return 预约列表
     */
    IPage<GuideReservation> getGuideReservations(Page<GuideReservation> page, Long guideId, String status, LocalDate date);

    /**
     * 分页查询展览的解说预约列表
     *
     * @param page         分页参数
     * @param exhibitionId 展览ID
     * @param status       预约状态（可选）
     * @param date         预约日期（可选）
     * @return 预约列表
     */
    IPage<GuideReservation> getExhibitionGuideReservations(Page<GuideReservation> page, Long exhibitionId, String status, LocalDate date);

    /**
     * 分页查询所有预约列表（管理员使用）
     *
     * @param page   分页参数
     * @param status 预约状态（可选）
     * @return 预约列表
     */
    IPage<GuideReservation> getAllReservations(Page<GuideReservation> page, String status);

    /**
     * 检查用户在指定日期是否已有解说员预约
     *
     * @param userId   用户ID
     * @param guideId  解说员ID
     * @param date     预约日期
     * @param timeSlot 时间段
     * @return 是否已有预约
     */
    boolean checkUserHasReservation(Long userId, Long guideId, LocalDate date, String timeSlot);

    /**
     * 获取用户的所有解说员预约
     *
     * @param userId 用户ID
     * @return 预约列表
     */
    List<GuideReservation> getUserAllReservations(Long userId);

    /**
     * 获取解说员的所有预约
     *
     * @param guideId 解说员ID
     * @return 预约列表
     */
    List<GuideReservation> getGuideAllReservations(Long guideId);

    /**
     * 获取展览的所有解说员预约
     *
     * @param exhibitionId 展览ID
     * @return 预约列表
     */
    List<GuideReservation> getExhibitionAllGuideReservations(Long exhibitionId);

    boolean confirm(Long id);
}